﻿#include "modbus.h"
#include "ui_modbus.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QVariant>
#include <QDateTime>
#include "globalval.h"

// 表示每个键值对的结构体
struct DataItem {
    int key;
    QVariant value; // 使用QVariant支持多种类型（int/bool）
};

// 表示整个JSON的结构体
struct MyData {
    int version;
    qint64 timestamp; // 时间戳通常较大，使用qint64
    QList<DataItem> dataItems;
};

modbus::modbus(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::modbus)
{
    ui->setupUi(this);
}

modbus::~modbus()
{
    delete ui;
}

MyData parseJson1(const QByteArray &jsonData) {
    MyData result;
    QJsonParseError parseError;
    QJsonDocument doc = QJsonDocument::fromJson(jsonData, &parseError);

    // 检查解析错误
    if (parseError.error != QJsonParseError::NoError) {
        qWarning() << "JSON Parse Error:" << parseError.errorString();
        return result;
    }

    // 获取根对象
    QJsonObject rootObj = doc.object();

    // 解析version和timestamp
    result.version = rootObj["version"].toInt();
    result.timestamp = static_cast<qint64>(rootObj["timestamp"].toDouble());

    // 解析data数组
    QJsonArray dataArray = rootObj["data"].toArray();
    for (const QJsonValue &itemVal : dataArray) {
        QJsonObject itemObj = itemVal.toObject();
        DataItem item;
        item.key = itemObj["key"].toInt();

        // 动态处理value类型（int或bool）
        QJsonValue valueVal = itemObj["value"];
        if (valueVal.isBool()) {
            item.value = valueVal.toBool();
        } else if (valueVal.isDouble()) {
            item.value = valueVal.toDouble(); // 存储为double
        }

        result.dataItems.append(item);

    }

    return result;
}


void modbus::dataUpSlot(QByteArray a)
{
    MyData myData = parseJson1(a);

    // 打印解析结果
    qDebug() << "Version:" << myData.version;
    // 改为使用setTime_t()方法
    QDateTime dt;
    dt.setTime_t(static_cast<uint>(myData.timestamp)); // 转换为32位无符号整数
    qDebug() << "Timestamp:" << dt.toString(Qt::ISODate);

    for (const DataItem &item : myData.dataItems) {
        qDebug() << "Key:" << item.key << "Value:" << item.value;
        if(item.key == 101) {
            // 格式化为带2位小数的字符串
            ui->label_sw->setText(QString::number(item.value.toDouble(), 'f', 2));
        }
        else if(item.key == 102) {
            ui->label_air->setText(QString::number(item.value.toDouble(), 'f', 2));
        }
        else if(item.key == 104) {
            ui->label_lgt->setText(QString::number(item.value.toDouble(), 'f', 2));
        }
    }
}

void modbus::on_pushButton_clicked()
{
    // 图片路径数组
    static const QString imagePaths[] = {
        ":/new/prefix1/关灯.png",  // 第一张图片
        ":/new/prefix1/开灯.png",  // 第二张图片
    };

    static int currentIndex = 0;  // 当前显示的图片索引

    // 加载下一张图片
    currentIndex = (currentIndex + 1) % 2;  // 两张图片循环

    // 创建QPixmap并设置到label
    QPixmap pixmap(imagePaths[currentIndex]);
    if(!pixmap.isNull()) {
        ui->label_4->setPixmap(pixmap.scaled(ui->label_4->size(),
                                            Qt::KeepAspectRatio,
                                            Qt::SmoothTransformation));
    } else {
        qWarning() << "Failed to load image:" << imagePaths[currentIndex];
    }

    if (GlobalVal::mqtt) {
        QJsonObject json;
        json["command"] = "control";
        json["key"] = 105; // 固定键值为305

        // 根据当前图片索引设置value值
        // 第一张图片(currentIndex=0) -> value=1
        // 第二张图片(currentIndex=1) -> value=0
        json["value"] = (currentIndex == 0) ? 0 : 1;

        // 转换为JSON文档
        QJsonDocument doc(json);
        QByteArray payload = doc.toJson(QJsonDocument::Compact);

        // 创建MQTT消息
        QMQTT::Message message;
        message.setTopic("down");      // 设置目标主题
        message.setPayload(payload);   // 设置JSON数据
        message.setQos(1);             // 设置服务质量等级

        // 发送消息
        GlobalVal::mqtt->publish(message);
        qDebug() << "发送控制命令: " << payload;
    } else {
        qWarning() << "MQTT handler not available";
    }
}

void modbus::on_pushButton_2_clicked()
{
    // 图片路径数组
    static const QString imagePaths[] = {
        ":/new/prefix1/关空调.png",  // 第一张图片
        ":/new/prefix1/开空调.png",  // 第二张图片
    };

    static int currentIndex = 0;  // 当前显示的图片索引

    // 加载下一张图片
    currentIndex = (currentIndex + 1) % 2;  // 两张图片循环

    // 创建QPixmap并设置到label
    QPixmap pixmap(imagePaths[currentIndex]);
    if(!pixmap.isNull()) {
        ui->label_5->setPixmap(pixmap.scaled(ui->label_5->size(),
                                            Qt::KeepAspectRatio,
                                            Qt::SmoothTransformation));
    } else {
        qWarning() << "Failed to load image:" << imagePaths[currentIndex];
    }

    if (GlobalVal::mqtt) {
        QJsonObject json;
        json["command"] = "control";
        json["key"] = 103; // 固定键值为305

        // 根据当前图片索引设置value值
        // 第一张图片(currentIndex=0) -> value=1
        // 第二张图片(currentIndex=1) -> value=0
        json["value"] = (currentIndex == 0) ? 0 : 1;

        // 转换为JSON文档
        QJsonDocument doc(json);
        QByteArray payload = doc.toJson(QJsonDocument::Compact);

        // 创建MQTT消息
        QMQTT::Message message;
        message.setTopic("down");      // 设置目标主题
        message.setPayload(payload);   // 设置JSON数据
        message.setQos(1);             // 设置服务质量等级

        // 发送消息
        GlobalVal::mqtt->publish(message);
        qDebug() << "发送控制命令: " << payload;
    } else {
        qWarning() << "MQTT handler not available";
    }
}
